package zz.extjs.dbc;

import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;

import java.net.URL;
import java.util.Properties;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

//使用DefaultHandler的好处 是 不必陈列出所有方法,
public class ParseXML extends DefaultHandler {

	// //定义一个Properties 用来存放 dbhost dbuser dbpassword的值
	private Properties props;

	private String currentSet;
	private String currentName;
	private StringBuffer currentValue = new StringBuffer();

	// 构建器初始化props
	public ParseXML() {

		this.props = new Properties();
	}

	public Properties getProps() {
		return this.props;
	}

	// 定义开始解析元素的方法. 这里是将 中的名称xxx提取出来.
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		currentValue.delete(0, currentValue.length());
		this.currentName = qName;

	}

	// 这里是将 之间的值加入到currentValue

	public void characters(char[] ch, int start, int length)
			throws SAXException {

		currentValue.append(ch, start, length);

	}

	// 在遇到 结束后,将之前的名称和值一一对应保存在props中

	public void endElement(String uri, String localName, String qName)
			throws SAXException {

		props.put(qName.toLowerCase(), currentValue.toString().trim());
	}
	
	public void parse(String filename) throws Exception {

		// 将我们的解析器对象化
		//ConfigParser handler = new ConfigParser();

		// 获取SAX工厂对象
		SAXParserFactory factory = SAXParserFactory.newInstance();
		factory.setNamespaceAware(false);
		factory.setValidating(false);

		// 获取SAX解析
		SAXParser parser = factory.newSAXParser();

		// 得到配置文件myenv.xml所在目录. tomcat中是在WEB-INF/classes
		// 下例中BeansConstants是用来存放xml文件中配置信息的类,可以自己代替或定义
		URL confURL = ParseXML.class.getClassLoader().getResource(
				filename);

		try {
			// 将解析器和解析对象myenv.xml联系起来,开始解析
			parser.parse(confURL.toString(), this);
			// 获取解析成功后的属性 以后 我们其他应用程序只要调用本程序的props就可以提取出属性名称和值了
			//props = handler.getProps();
		} finally {
			factory = null;
			parser = null;
			//handler = null;
		}

	}

}